<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>组件实例三个属性1：state</title>
    </head>
    <body>
        <!-- 准备好DOM容器 -->
        <div id="test"></div>

        <!-- 必须按照顺序引入JS -->
        <!-- 引入React核心库 -->
        <script src="../js/react.development.js"></script>
        <!-- 引入react-dom库，用于操作DOM -->
        <script src="../js/react-dom.development.js"></script>
        <!-- 引入babel，用于将JSX翻译为JS -->
        <script src="../js/babel.min.js"></script>

        <!-- type必须为text/babel，代表里面的内容为JSX -->
        <script type="text/babel">
            class Weather extends React.Component {
                // React.Component的构造函数接收props
                constructor(props) {
                    super(props);
                    // 初始化React.Component自带的state属性，必须是一个对象
                    this.state = { isHot: true };
                    // 解决实例方法在绑定事件时的this指向问题，使用bind方法后，实例方法中的this被设置为bind方法的参数
                    this.changeWeather = this.changeWeather.bind(this);
                }

                changeWeather() {
                    // 由于changeWeather作为onClick的回调，不是通过实例调用的，是直接调用
                    // 类中的方法默认开启了局部的严格模式，所以this为undefined
                    console.log(this);

                    // 状态（state）中的数据不能直接更改，必须使用setState方法
                    // this.state.isHot = !this.state.isHot;
                    this.setState({ isHot: !this.state.isHot });
                }

                render() {
                    console.log(this);
                    const { isHot } = this.state;
                    return (
                        // 注意onClick必须用camelCase写，且绑定的事件函数不能加括号
                        // 实例函数必须用this.函数名配置
                        <h1 onClick={this.changeWeather}>
                            今天天气很{isHot ? "炎热" : "凉爽"}
                        </h1>
                    );
                }
            }

            ReactDOM.render(<Weather />, document.getElementById("test"));
        </script>
    </body>
</html>
